/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package blogic;

import bentity.beCombo;
import bentity.beLineaIngresos;
import bentity.beLineaKardex;
import bentity.bePallet;
import bentity.beProducto;
import bentity.beProveedor;
import bentity.beTipoProducto;
import dao.daoCliente;
import dao.daoHelper;
import dao.daoProducto;
import dao.daoProveedor;
import java.sql.Date;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import visual.Seguridad.visualHelper;

/**
 *
 * @author chokewanka
 */
public class blProducto {
    private int resultadoSQL;
    public static final int EXITO=0;
    public static final int ERROR=-1;

    public ArrayList<beProducto> busquedaProductosBL(String nombreProducto,String costoProducto,int tipoProducto,int proveedorProducto) throws Exception{
        double cP=-1;

            if(costoProducto.equals("")) cP=-1;
            else if((new blHelper()).cadenaSoloDouble(costoProducto)) cP=Double.parseDouble(costoProducto);
            else{
                return null;
            }

//            if(tipoProducto<0){
//                visualHelper.mostrarMensajeError("El tipo de producto elegido es un valor inválido. Elija otro tipo de producto.");
//                return null;
//            }
//
//            if(proveedorProducto<0){
//                visualHelper.mostrarMensajeError("El proveedor elegido es inválido. Elija otro proveedor.");
//                return null;
//            }

            ArrayList<beProducto> listaProductos=(new daoProducto()).busquedaProductosDAO(nombreProducto,cP,tipoProducto,proveedorProducto);

            if (listaProductos==null || listaProductos.size()==0) return null;
            return listaProductos;


    }

    public ArrayList<beProducto> obtenerProductosPorCodigoNombre(String cadBusqueda) throws Exception{
        ArrayList<beProducto> productos = new ArrayList<beProducto>();
        if ((new blHelper()).caracteresSoloDigitos(cadBusqueda)){
            int idProducto = Integer.parseInt(cadBusqueda);
            beProducto p = (new daoProducto()).busquedaProductosPorID(idProducto);
            if (p != null)
                productos.add(p);
            return productos;
        }
        else
            return ((new daoProducto()).busquedaProductosPorNombre(cadBusqueda));
    }

    public ArrayList<beTipoProducto> obtenerTodosLosTiposProductos() throws Exception{
        return (new daoProducto()).todosLosTipoProducto();
    }

    public beProducto obtenerProductoSiVence7Dias(int id_Lote, int id_Producto) throws Exception{
        return (new daoProducto()).obtenerProductoSiVence7Dias(id_Lote, id_Producto);
    }


    public ArrayList<beCombo> llenarComboTipoProducto(boolean colocarElementoPorDefault, String textoPorDefault) throws Exception{
            ArrayList<beTipoProducto> arrTipoProd = new ArrayList<beTipoProducto>();
            arrTipoProd = (new blProducto()).obtenerTodosLosTiposProductos();
            ArrayList<beCombo> comboTipoProducto = new ArrayList<beCombo>();
            beCombo cmb = new beCombo();
            if (colocarElementoPorDefault) {
                cmb.setId_dato(0);
                cmb.setNom_dato(textoPorDefault);
                cmb.setNom_combo("TIPPRO");
                comboTipoProducto.add(cmb);
            }
            for (int i = 0; i < arrTipoProd.size(); i++) {
                cmb = new beCombo();
                cmb.setId_dato(arrTipoProd.get(i).getId());
                cmb.setNom_dato(arrTipoProd.get(i).getDescripcion());
                cmb.setNom_combo("TIPPRO");
                comboTipoProducto.add(cmb);
            }
            return comboTipoProducto;
    }

    public int dameIdEstadoProducto(String nombreEstado) throws Exception{

            int idEstado = -1;
            if (!esEstadoValido(nombreEstado)) {
                return idEstado;
            }
            idEstado = (new daoHelper()).dameIdEstado(nombreEstado, beProducto.nombreCombo);
            return idEstado;
    }

    private boolean esEstadoValido(String nombreEstado) {
        if(nombreEstado.equals(beProducto.nombreActivo)) return true;
        else if(nombreEstado.equals(beProducto.nombreInactivo)) return true;
        return false;
    }

    public String dameNombreEstadoProducto(int idEstado) throws Exception{
            if(idEstado<0) return "";
            
            String nombreEstado = "";
            nombreEstado = (new daoHelper()).dameNombreEstado(idEstado, beProducto.nombreCombo);
            return nombreEstado;
    }

    public boolean estaActivo(int idEstado) throws Exception{
        return this.dameNombreEstadoProducto(idEstado).equals(beProducto.nombreActivo);
    }

    public boolean estaInactivo(int idEstado) throws Exception{
        return this.dameNombreEstadoProducto(idEstado).equals(beProducto.nombreInactivo);
    }

    public int registrarProducto(beProducto pd) throws Exception{
        if(pd==null) {
               return ERROR;
        }

        int result=(new daoProducto()).registrarProducto(pd);

        return result;


    }

    public int registrarProductoConStock(beProducto pd) throws Exception{
        if(pd==null) {
               return ERROR;
        }

        int result=(new daoProducto()).registrarProductoConStock(pd);

        return result;


    }

    public int registrarProductoXProveedor(beProducto pd, ArrayList<Integer> arrProv) throws Exception{
        daoProducto daop=new daoProducto();

        if (pd==null || arrProv==null) return ERROR;

        for(int i=0;i<arrProv.size();i++){
            this.resultadoSQL=daop.registrarProductoXProveedor(pd.getIdProducto(),arrProv.get(i));
            if(this.resultadoSQL==daoHelper.TRANSACCION_FALLIDA) return ERROR;
        }

        return EXITO;
    }

    public beProducto obtenerProductoPorCodigo(int idProducto) throws Exception{

            if(idProducto<0) return null;
            return (new daoProducto()).busquedaProductosPorID(idProducto);

    }

    //pd.id_Producto es el Id del producto a modificar
    //Los demas elementos de pd son los nuevos valores a agregar
    public int modificarProducto(beProducto pd) throws Exception{
        if(pd==null) return ERROR;

        if(pd.getIdProducto()<0) return ERROR;

        this.resultadoSQL=(new daoProducto()).modificarProducto(pd);

        if(this.resultadoSQL==daoHelper.TRANSACCION_FALLIDA) return ERROR;

        return EXITO;
    }

    public int modificarProductoXProveedor(beProducto pd, ArrayList<Integer> arrProvNuevo) throws Exception{
            daoProducto daop = new daoProducto();

            if(pd == null || arrProvNuevo==null) return ERROR;

            ArrayList<beProveedor> arrProvOrig=(new daoProveedor()).dameProveedoresDeUnProducto(pd.getIdProducto());
            boolean datoSeMantiene=false;

            for (int i = 0; i < arrProvNuevo.size(); i++) {
                for(int j=0;j<arrProvOrig.size();j++){
                    if(arrProvNuevo.get(i)==arrProvOrig.get(j).getId_Proveedor()){
                        arrProvOrig.remove(j);
                        datoSeMantiene=true;
                        break;
                    }
                }
                if(datoSeMantiene) break;

                this.resultadoSQL = daop.registrarProductoXProveedor(pd.getIdProducto(), arrProvNuevo.get(i));
                if (this.resultadoSQL == daoHelper.TRANSACCION_FALLIDA) {
                    return ERROR;
                }
                datoSeMantiene=false;
            }

            for(int i=0;i<arrProvOrig.size();i++){
                this.resultadoSQL = daop.eliminarProductoXProveedor(pd.getIdProducto(), arrProvOrig.get(i).getId_Proveedor());
                if (this.resultadoSQL == daoHelper.TRANSACCION_FALLIDA) {
                    return ERROR;
                }
                datoSeMantiene=false;
            }

            return EXITO;

    }

    public beTipoProducto devuelveTipoProducto(int idTipoProducto) throws Exception{
        if(idTipoProducto<0) return null;

        return (new daoProducto()).devuelveTipoProducto(idTipoProducto);

    }

    public int eliminarProducto(int idProducto) throws Exception{
        if(idProducto<0) return ERROR;

        int estado=(new blProducto()).dameIdEstadoProducto(beProducto.nombreInactivo);

        this.resultadoSQL=(new daoProducto()).cambiarEstadoAProducto(idProducto,estado);

        if(resultadoSQL==daoHelper.TRANSACCION_FALLIDA) return ERROR;

        return EXITO;
    }

    private int eliminarProductoXProveedordeUnProducto(int idProducto) throws Exception{
        if(idProducto<0) return ERROR;

        ArrayList<beProveedor> arrProvs=(new daoProveedor()).dameProveedoresDeUnProducto(idProducto);

        if(arrProvs==null) return EXITO;

        for(int i=0;i<arrProvs.size();i++){
            (new daoProducto()).eliminarProductoXProveedor(idProducto, arrProvs.get(i).getId_Proveedor());
        }

        return EXITO;

    }

    public double obtenerPrecioProducto(int idProducto) throws Exception{
        return (new daoProducto()).obtenerPrecioProducto(idProducto);
    }

    public int actualizarStock(int id,String motivo) throws SQLException{
         return (new daoProducto()).actualizarStock(id,motivo);
    }

    public int disminuirStock(int idProducto,int cantidadCajas) throws SQLException{
         return (new daoProducto()).disminuirStock(idProducto,cantidadCajas);
    }

    public int actualizarStockAgregado(ArrayList<bePallet> arrPallet) throws Exception{
         return (new daoProducto()).actualizarStockAgregado(arrPallet);
    }

    public ArrayList<beProducto> obtenerReporteInventario(String strProveedor, String strTipoProducto) throws Exception{
        return (new daoProducto()).queryInventaryReport(strProveedor, strTipoProducto);
    }

    public ArrayList<beLineaKardex> obtenerReporteKardex(int idProducto, Date fechaDesde, Date fechaHasta) throws Exception{
        ArrayList<beLineaKardex> kardex = (new daoProducto()).queryKardexReport(idProducto,fechaDesde,fechaHasta);
        for(int i=(kardex.size()-1); i>0; i--){
            if (kardex.get(i).getMovimiento().equals("INGRESO"))
                kardex.get(i-1).setStock(kardex.get(i).getStock()-kardex.get(i).getNumCajas());
            if (kardex.get(i).getMovimiento().equals("SALIDA"))
                kardex.get(i-1).setStock(kardex.get(i).getStock()+kardex.get(i).getNumCajas());;
        }
        return kardex;
    }

    public ArrayList<beLineaIngresos> obtenerReporteIngresos(Date fechaDesde, Date fechaHasta) throws Exception{
        return (new daoProducto()).queryEntranceReport(fechaDesde, fechaHasta);
    }

    public ArrayList<beProducto> obtenerDescEstados(ArrayList<beProducto> productos) throws Exception{
        if (productos == null)
            return null;
        blProducto bp = new blProducto();
        beTipoProducto tp = null;
        for(int i=0; i<productos.size();i++){
            tp = bp.devuelveTipoProducto(productos.get(i).getTipoProducto());
            if (tp != null)
                productos.get(i).setDescTipoProducto(tp.getDescripcion());
        }
        return productos;
    }


}
